home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / tools / post2_g2 / pmake / pmake.c next >
Text File  |  1997-10-13  |  19KB  |  870 lines

  1. /*
  2.     新postmake
  3.  
  4.     1997.09.19
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <ctype.h>
  11. #define    VERSION    "2.00"
  12. typedef    unsigned char    uchar;
  13.  
  14. void    main( int argc, uchar *argv[] );
  15. void    usage( void );
  16. void    get_koumoku( int num_koumoku, uchar *str_ret_ptr );
  17. void    ke_test( uchar *strptr );
  18. int        str_ncmp( uchar *gen_todo, uchar *work_todo );
  19. void    number_check( uchar *juusyo2, uchar *juusyo1 );
  20. void    put_data( uchar shikibetu, uchar *juusyo );
  21. int        get_ken_code( uchar *moto );
  22. int        shiku_hantei( uchar *shiku, int yomi_ken );
  23. void    num_put( void );
  24. void    del_last_char( uchar workstr[128] );
  25. void    shiku_bunri( int yomi_ken );
  26. int        gun_bunri( int yomi_ken );
  27. void    syori( void );
  28.  
  29.  
  30. /*
  31.     グローバル変数宣言
  32. */
  33. FILE    *ai,*bi;        /* ファイル用 */
  34.  
  35. int    ctr,            /* カウンタ(オフセット算出用) */
  36.     tousyo_sw = 0,        /* 島しょ処理スイッチ */
  37.     old_kubun = 0,        /* 直前に処理したデータの市町村区分 */
  38.     shiku_kubun = 0;    /* 市町村区分 */
  39.  
  40. uchar    ken,            /* 県コード */
  41.     moto_str[256],        /* 元ファイルからの入力行保持用文字列 */
  42.     old_kugun[64],
  43.     gun_yomi[64],
  44.     tyouson_yomi[64],
  45.     gen_todo[9],        /* 現在処理中の都道府県名 */
  46.     gen_shiku[23],        /* 現在処理中の市区郡町村名 */
  47.     gen_shi[32],
  48.     gen_gun[32];
  49.  
  50. uchar    work_todo[9],
  51.     work_shiku[64],
  52.     work_shigun[64],
  53.     work_azamei[1024],
  54.     work_azamei2[128],
  55.     work_yomi[128];
  56.  
  57. uchar    seirei_toshi[12][2][10] = {        /* 政令指定都市 */
  58.     "札幌市",    "サツポロシ",
  59.     "仙台市",    "センダイシ",
  60.     "千葉市",    "チバシ",
  61.     "横浜市",    "ヨコハマシ",
  62.     "川崎市",    "カワサキシ",
  63.     "名古屋市",    "ナゴヤシ",
  64.     "京都市",    "キヨウトシ",
  65.     "大阪市",    "オオサカシ",
  66.     "神戸市",    "コウベシ",
  67.     "広島市",    "ヒロシマシ",
  68.     "北九州市",    "キタキユウシユウシ",
  69.     "福岡市",    "フクオカシ"
  70.     };
  71.  
  72. int    seirei_toshisuu = 12;
  73.  
  74. uchar    tousyo[9][2][11] = {        /* 島しょ */
  75.     "大島",        "オオシマ",
  76.     "利島",        "トシマ",
  77.     "新島",        "ニイジマ",
  78.     "神津島",    "コウヅシマ",
  79.     "三宅島",    "ミヤケジマ",
  80.     "御蔵島",    "ミクラジマ",
  81.     "八丈島",    "ハチジヨウジマ",
  82.     "青ケ島",    "アオガシマ",
  83.     "小笠原諸島",    "オガサワラシヨトウ"
  84.     };
  85.  
  86. int    tousuu = 9;
  87.  
  88. /*
  89.     メイン
  90. */
  91. void
  92. main( int argc, uchar *argv[] )
  93. {
  94.     setvbuf( stdout, NULL, _IONBF, 0 );    /* 標準出力のバッファ禁止 */
  95.                         /* こっちの方が表示がかっこ良いので */
  96.  
  97.     tousyo_sw = 0;
  98.  
  99.     /* ai : 元ファイル all.csv */
  100.     if( (ai = fopen( "all.csv", "rt")) == NULL) {
  101.         puts("変換元ファイル all.csv がオープンできません。");
  102.         usage();
  103.         exit( 1 );
  104.     }
  105.  
  106.     /* bi : 諸元ファイル post.dat */
  107.     if( (bi = fopen( "post.dat", "wt")) == NULL) {
  108.         puts("諸元ファイル post.dat がオープンできません。");
  109.         usage();
  110.         exit( 1 );
  111.     }
  112.  
  113.     ken = 0;    /* 県コードはとりあえず0 */
  114.     ctr = 0;    /* カウンタリセット */
  115.     gen_todo[ 0 ] = '\0';        /* 現在処理中の都道府県名 */
  116.     gen_shiku[ 0 ] = '\0';        /* 現在処理中の市区町村名 */
  117.  
  118.     /*
  119.         本処理
  120.     */
  121.     do {
  122.         if( fgets( moto_str, 256, ai ) == NULL ) {
  123.             if( feof(ai) ) {
  124.                 break;
  125.             } else {
  126.                 printf("ファイル読み込みエラー\n");
  127.                 usage();
  128.                 exit(1);
  129.             }
  130.         }
  131.         syori();    /* 中身を処理 */
  132.  
  133.     } while( 1 );
  134.  
  135.     puts("");
  136.     fclose( ai );
  137.     fclose( bi );
  138.  
  139.     return;
  140. }
  141.  
  142.  
  143. /*
  144.     使用法表示
  145. */
  146. void
  147. usage()
  148. {
  149.     printf("郵便番号ファイル変換プログラム postmake Ver %s",VERSION);
  150.     printf(" Created by 中村隆生(満開製作所) 1993.\n\n");
  151.     printf("使用法:postmake <元ファイル名1> <元ファイル名2>\n");
  152.     printf("    カレントディレクトリに郵便番号ファイル post.dat と");
  153.     printf("オフセット post.ofs を作成します。\n");
  154.  
  155.     return;
  156. }
  157.  
  158.  
  159. /*
  160.     項目取得
  161.  
  162.     要求仕様:
  163.         moto_str のn番目の項目を取得する。
  164.         得た文字列はstr_ret_ptrに格納する。
  165.         項目は必ずダブルクォーテーションで囲まれているものとする。
  166.  
  167.         項目スキップの目印にはカンマと " を使用しているが、シフトJISの
  168.         文字にはカンマと " は使用していない。
  169. */
  170. void
  171. get_koumoku( int num_koumoku, uchar *str_ret_ptr )
  172. {
  173.     int    i1,    /* ループ汎用 */
  174.         len;
  175.  
  176.     uchar    *moto_ptr,    /* ワークのポインタ */
  177.         *check_ptr;    /* チェック用のポインタ */
  178.  
  179.     check_ptr = str_ret_ptr;    /* ポインタの待避 */
  180.  
  181.     moto_ptr = moto_str;    /* ポインタのセット */
  182.  
  183.     /*
  184.         項目の頭出し
  185.     */
  186.     for( i1=1; i1<=num_koumoku-1; ++i1 ) {
  187.         while( (*moto_ptr++) != ',' )    /* 次の「,」まで読みとばし */
  188.             ;
  189.     }
  190.     moto_ptr++;    /* その次の「"」も読みとばし */
  191.  
  192.     for(;;) {                /* 次の「"」まで文字列を複写 */
  193.         if( *moto_ptr != '\"' ) {    /* 「"」は複写しない */
  194.             *str_ret_ptr++ = *moto_ptr++;
  195.         } else {
  196.             break;
  197.         }
  198.     }
  199.  
  200.     *str_ret_ptr = '\0';    /* 終端記号の付加 */
  201.  
  202.     if( num_koumoku == 4 || num_koumoku == 5 || num_koumoku == 6 ) {
  203.  
  204.         len = strlen( check_ptr );
  205.         for( i1=0; i1<=len-1; i1++ ) {
  206.             if( *check_ptr == 0xaf ) {        /* ッ */
  207.                 *check_ptr = 0xc2;        /* ツ */
  208.             } else if( *check_ptr == 0xac ) {    /* ャ */
  209.                 *check_ptr = 0xd4;        /* ヤ */
  210.             } else if( *check_ptr == 0xad ) {    /* ュ */
  211.                 *check_ptr = 0xd5;        /* ユ */
  212.             } else if( *check_ptr == 0xae ) {    /* ョ */
  213.                 *check_ptr = 0xd6;        /* ヨ */
  214.             }
  215.             check_ptr++;
  216.         }
  217.     } else {
  218.         ke_test( check_ptr );    /* ヵとヶのテスト */
  219.     }
  220.  
  221.     return;
  222. }
  223.  
  224.  
  225. /*
  226.     ヵとヶのテスト
  227.  
  228.     ヵかヶを見付けたら、それぞれカとケに変換する
  229. */
  230. void
  231. ke_test( uchar *strptr )
  232. {
  233.     int    i1 = 0,        /* ループ汎用 */
  234.         len = 0;    /* 長さ */
  235.  
  236.     len = strlen( strptr );
  237.  
  238.     for( i1=0; i1<=len-1; i1+=2 ) {        /* 対象は全部全角なので2個とばし */
  239.  
  240.         if( *strptr == 0x83 ) {        /* 83 …… ヵとヶの1バイト目 */
  241.  
  242.             strptr++;    /* 1個進める */
  243.  
  244.             if( *strptr == 0x95 ) {        /* ヵ */
  245.                 *strptr = 0x4a;        /* カ */
  246.             } else if( *strptr == 0x96 ) {    /* ヶ */
  247.                 *strptr = 0x50;        /* ケ */
  248.             }
  249.  
  250.             strptr++;    /* 1個進める */
  251.         } else {
  252.  
  253.             strptr += 2;    /* 2個進める */
  254.         }
  255.     }
  256.  
  257.     return;
  258. }
  259.  
  260.  
  261. /*
  262.     高速な(うそ)文字列照合ルーチン
  263. */
  264. int
  265. str_ncmp( uchar *gen_todo, uchar *work_todo )
  266. {
  267.     if( *gen_todo != *work_todo ) {        /* まず先頭1文字を比較してしまう */
  268.         return 1;
  269.     }
  270.  
  271.     return ( strcmp( gen_todo, work_todo ) );
  272. }
  273.  
  274.  
  275. /*
  276.     数字チェック
  277.  
  278.     全角数字を半角数字にして返す
  279. */
  280. void
  281. number_check( uchar *juusyo2, uchar *juusyo1 )
  282. {
  283.     int    len_str = 0,    /* 文字列長さ */
  284.         i1 = 0;        /* ループ汎用 */
  285.  
  286.     len_str = strlen( juusyo1 );
  287.  
  288.     for( i1=0; i1<=len_str-1; i1++ ) {
  289.  
  290.         if( isdigit( (int)*juusyo1 ) ) {    /* すでに半角数字=郵便番号 */
  291.             *juusyo2++ = *juusyo1++;    /* 1バイトだけ */
  292.             continue;
  293.         }
  294.  
  295. //        if( *juusyo1 == 0x82 ) {            /* 全角数字の1バイト目? */
  296. //
  297. //            if( (*(juusyo1+1) <= 0x59) && (*(juusyo1+1) >= 0x4f) ) {
  298. //                ++juusyo1;                /* 1個進める */
  299. //                *juusyo2++ = (*juusyo1++) - 0x1f;    /* 半角数字化 */
  300. //            } else {
  301. //                *juusyo2++ = *juusyo1++;    /* たぶん全角 */
  302. //                *juusyo2++ = *juusyo1++;
  303. //            }
  304. //        } else {
  305.             *juusyo2++ = *juusyo1++;        /* 全角だといいな */
  306.             *juusyo2++ = *juusyo1++;
  307. //        }
  308.  
  309.         ++i1;    /* ひえ~ */
  310.     }
  311.  
  312.     *juusyo2 = '\0';    /* 終端文字をセット */
  313.  
  314.     return;
  315. }
  316.  
  317.  
  318. /*
  319.     住所データ出力
  320.  
  321.     半角英字1文字と住所を受け取る。
  322.     英字1文字と住所をそのまま ci に書き出し、
  323.     グローバル変数 ctr に1+(住所の文字数)を足し込む。
  324. */
  325. void
  326. put_data( uchar shikibetu, uchar *juusyo )
  327. {
  328.     uchar    juusyo2[1024],    /* 受け皿 */
  329.         *j2_ptr;
  330.  
  331.     j2_ptr = juusyo2;    /* ポインタセット */
  332.  
  333.     number_check( j2_ptr, juusyo );    /* 数字チェック */
  334.  
  335.     fputc( shikibetu, bi );
  336.     fputs( j2_ptr, bi );
  337.     ctr += (1 + strlen( j2_ptr ) );
  338.  
  339.     return;
  340. }
  341.  
  342.  
  343. /*
  344.     もらった行から県コードを抽出して返す
  345. */
  346. int
  347. get_ken_code( uchar *moto )
  348. {
  349.     uchar    ch1, ch2;
  350.  
  351.     ch1 = moto[0];
  352.     ch2 = moto[1];
  353.  
  354.     return ((ch1 - 0x30) * 10) + (ch2 - 0x30);
  355. }
  356.  
  357.  
  358. /*
  359.     市区郡判定
  360.  
  361.     末尾の1字を見て、市区郡の判定を行い、戻り値とする。
  362.  
  363.         1=市 2=市内区 3=特別区 4=郡+町 5=郡+村
  364. */
  365. int
  366. shiku_hantei( uchar *shiku, int yomi_ken )
  367. {
  368.     int    kubun = 0,    /* 市区区分 */
  369.         len_shiku;    /* 長さ格納用 */
  370.     uchar    moji_work[3];    /* 全角2文字ワーク */
  371.  
  372.     len_shiku = strlen( shiku );    /* まず長さを得る */
  373.  
  374.     moji_work[0] = shiku[len_shiku-2];    /* 末尾の1文字(ただし全角)を得る */
  375.     moji_work[1] = shiku[len_shiku-1];
  376.     moji_work[2] = '\0';
  377.     /* 原始的な事をやってますが、単なる */
  378.     /* 手抜きですので気にしないでいいです */
  379.  
  380.     if( str_ncmp( moji_work, "市" ) == 0 ) {
  381.         kubun = 1;    /* 単なる市 */
  382.  
  383.     } else if( str_ncmp( moji_work, "区" ) == 0 ) {
  384.         if( yomi_ken == 13 ) {    /* 東京都内である */
  385.             kubun = 3;    /* 東京都特別区 */
  386.         } else {
  387.             kubun = 2;    /* 政令指定都市内の区 */
  388.         }
  389.  
  390.     } else if( str_ncmp( moji_work, "町" ) == 0 ) {
  391.         kubun = 4;    /* 町 */
  392.     } else if( str_ncmp( moji_work, "村" ) == 0 ) {
  393.         kubun = 5;    /* 村 */
  394.     } else {
  395.         printf("FAIL : 末尾が市区町村でない(|%s|)\n",moji_work);
  396.         exit(1);
  397.     }
  398.  
  399.     return( kubun );
  400. }
  401.  
  402.  
  403. /*
  404.     郵便番号の獲得と書出
  405. */
  406. void
  407. num_put()
  408. {
  409.     uchar    bangou[8],        /* 郵便番号用ワーク */
  410.         kban[8];        /* 旧番号 */
  411.  
  412.     get_koumoku( 3, bangou );    /* 郵便番号を得る */
  413.     get_koumoku( 2, kban );
  414. /*
  415. 旧番号と新番号の比較チェック:結構違うことが分かったのでコメントアウト
  416.  
  417.     k_len = strlen( kban );
  418.  
  419.     for( i1=0; i1<=k_len-1; i1++ ) {
  420.         if( bangou[i1] != kban[i1] ) {
  421.             printf("反例発見 |%s| != |%s|\n",bangou,kban);
  422.             break;
  423.         }
  424.     }
  425. */
  426.  
  427.     put_data( '*', bangou );    /* 郵便番号出力 */
  428.     put_data( '\'', kban );        /* 旧番号出力 */
  429.  
  430.     return;
  431. }
  432.  
  433.  
  434. /*
  435.     後の全角1文字を削除する
  436. */
  437. void
  438. del_last_char( uchar workstr[128] )
  439. {
  440.     int    len_str = 0;
  441.  
  442.     len_str = strlen( workstr );
  443.  
  444.     workstr[ len_str - 2 ] = '\0';
  445.  
  446.     return;
  447. }
  448.  
  449.  
  450. /*
  451.     市区分離
  452.  
  453.     政令指定都市のみ:市名から区名を分離する
  454. */
  455. void
  456. shiku_bunri( int yomi_ken )
  457. {
  458.     int    nagasa=0,
  459.         nagasa2=0,
  460.         cnt=0,
  461.         toshi=0,
  462.         i1;
  463.  
  464.     uchar    basyo[64];
  465.  
  466.     nagasa = strlen( work_shiku );
  467.  
  468.     /* 「市」の字を探す 8e73 */
  469.     /* 1文字目と最後の文字は探さない */
  470.     for( i1=2; i1<=nagasa-4; i1+=2 ) {
  471.         if( work_shiku[i1] == 0x8e && work_shiku[i1+1] == 0x73 ) {
  472.             cnt++;
  473.             basyo[cnt] = i1;
  474.         }
  475.     }
  476.  
  477.     switch( cnt ) {
  478.  
  479.     /* 「市」の文字がひとつもない=おかしい */
  480.     case 0:
  481.         printf("市がない。おかしい|%s|\n",work_shiku);
  482.         break;
  483.  
  484.     /* 「市」の文字がひとつ=普通 */
  485.     case 1:
  486.         /* 市名を分離 */
  487.         for( i1=0; i1<=basyo[1]-1; i1++ ) {
  488.             work_shigun[i1] = work_shiku[i1];
  489.         }
  490.         work_shigun[basyo[1]] = '\0';
  491.         /* 区名を分離 */
  492.         for( i1=basyo[1]+2; i1<=nagasa-1; i1++ ) {
  493.             work_shiku[i1-basyo[1]-2] = work_shiku[i1];
  494.         }
  495.         work_shiku[nagasa-basyo[1]-2] = '\0';
  496.  
  497.         /* 市名を特定 */
  498.         toshi = -1;
  499.         for( i1=0; i1<=seirei_toshisuu-1; i1++ ) {
  500.             if( strstr( work_yomi, seirei_toshi[i1][1] ) != NULL ) {
  501.                 toshi = i1;
  502.                 break;
  503.             }
  504.         }
  505.         if( toshi == -1 ) {
  506.             printf("市名が現れなかった。おかしい|%s|\n",work_yomi);
  507.             return;
  508.         }
  509.  
  510.         /* 市名を分離 */
  511.         strcpy( gun_yomi, seirei_toshi[toshi][1] );
  512.  
  513.         /* 区名を分離 */
  514.         nagasa = strlen( work_yomi );
  515.         nagasa2 = strlen( seirei_toshi[toshi][1] );
  516.         for( i1=nagasa2; i1<=nagasa-1; i1++ ) {
  517.             tyouson_yomi[i1-nagasa2] = work_yomi[i1];
  518.         }
  519.         tyouson_yomi[nagasa - nagasa2] = '\0';
  520.  
  521.         break;
  522.  
  523.     case 2:
  524.         printf("市がふたつ|%s|\n",gen_shiku);
  525.         break;
  526.  
  527.     /* その他=おかしい */
  528.     default:
  529.         printf("市が3つ以上ある。|%s|\n",gen_shiku);
  530.         break;
  531.     }
  532.  
  533.     return;
  534. }
  535.  
  536.  
  537. /*
  538.     郡分離
  539.  
  540.     町村名から郡名を分離する
  541. */
  542. int
  543. gun_bunri( int yomi_ken )
  544. {
  545.     int    nagasa=0,
  546.         nagasa2 = 0,
  547.         ret = 0,
  548.         cnt=0,
  549.         shima = 0,
  550.         i1;
  551.  
  552.     uchar    basyo[64];
  553.  
  554.     nagasa = strlen( work_shiku );
  555.  
  556.     /* 「郡」の字を探す 8c53 */
  557.     /* 1文字目と最後の文字は探さない */
  558.     for( i1=2; i1<=nagasa-4; i1+=2 ) {
  559.         if( work_shiku[i1] == 0x8c && work_shiku[i1+1] == 0x53 ) {
  560.             cnt++;
  561.             basyo[cnt] = i1;
  562.         }
  563.     }
  564.  
  565.     switch( cnt ) {
  566.  
  567.     /* 「郡」の文字がひとつもない=東京都島しょの特例 */
  568.     case 0:
  569.         /* 「島」の字を探す */
  570.         for( i1=2; i1<=nagasa-4; i1+=2 ) {
  571.             if( work_shiku[i1] == 0x93 && work_shiku[i1+1] == 0x87 ) {
  572.                 cnt++;
  573.                 basyo[cnt] = i1;
  574.             }
  575.         }
  576.         /* 町村名を分離 */
  577.         for( i1=basyo[1]+2; i1<=nagasa-1; i1++ ) {
  578.             work_shiku[i1-basyo[1]-2] = work_shiku[i1];
  579.         }
  580.         work_shiku[nagasa-basyo[1]-2] = '\0';
  581.  
  582.         /* 島名を特定 */
  583.         shima = -1;
  584.         for( i1=0; i1<=tousuu-1; i1++ ) {
  585.             if( strstr( work_yomi, tousyo[i1][1] ) != NULL ) {
  586.                 shima = i1;
  587.                 break;
  588.             }
  589.         }
  590.         if( shima == -1 ) {
  591.             printf("島名が現れなかった。おかしい|%s|\n",work_yomi);
  592.             return 0;
  593.         }
  594.  
  595.         /* 町村名を分離 */
  596.         nagasa = strlen( work_yomi );
  597.         nagasa2 = strlen( tousyo[shima][1] );
  598.         for( i1=nagasa2; i1<=nagasa-1; i1++ ) {
  599.             tyouson_yomi[i1-nagasa2] = work_yomi[i1];
  600.         }
  601.         tyouson_yomi[nagasa - nagasa2] = '\0';
  602.         ret = 1;
  603.  
  604.         if( tousyo_sw == 0 ) {
  605.             strcpy( work_shigun, "島しょ" );
  606.             strcpy( gun_yomi, "トウシヨ" );
  607.             tousyo_sw = 1;
  608.         }
  609.         break;
  610.  
  611.     /* 「郡」の文字がひとつ=普通、ふたつ=町名の中に「郡」の字が使われている */
  612.     case 1:
  613.     case 2:
  614.         /* 郡名を分離 */
  615.         for( i1=0; i1<=basyo[1]-1; i1++ ) {
  616.             work_shigun[i1] = work_shiku[i1];
  617.         }
  618.         work_shigun[basyo[1]] = '\0';
  619.         /* 町村名を分離 */
  620.         for( i1=basyo[1]+2; i1<=nagasa-1; i1++ ) {
  621.             work_shiku[i1-basyo[1]-2] = work_shiku[i1];
  622.         }
  623.         work_shiku[nagasa-basyo[1]-2] = '\0';
  624.  
  625.         /* 郡の読み「グン」の位置を特定 */
  626.         cnt = 0;
  627.         nagasa = strlen( work_yomi );
  628.         for( i1=2; i1<=nagasa; i1++ ) {
  629.             if( work_yomi[i1  ]==0xb8 &&
  630.                 work_yomi[i1+1]==0xde &&
  631.                 work_yomi[i1+2]==0xdd ) {
  632.                 cnt++;
  633.                 basyo[1] = i1;
  634.                 break;
  635.             }
  636.         }
  637.         /* 郡名の読みを分離 */
  638.         for( i1=0; i1<=basyo[1]+2; i1++ ) {
  639.             gun_yomi[i1] = work_yomi[i1];
  640.         }
  641.         gun_yomi[basyo[1]+3] = '\0';
  642.         /* 町村名の読みを分離 */
  643.         for( i1=basyo[1]+3; i1<=nagasa-1; i1++ ) {
  644.             tyouson_yomi[i1-basyo[1]-3] = work_yomi[i1];
  645.         }
  646.         tyouson_yomi[nagasa-basyo[1]-3] = '\0';
  647.  
  648.         break;
  649.  
  650.     /* その他=おかしい */
  651.     default:
  652.         printf("おかしい。「郡」が3つ以上|%s|",work_shiku);
  653.         break;
  654.     }
  655.  
  656.     return ret;
  657. }
  658.  
  659.  
  660. /*
  661.     本処理
  662. */
  663. void
  664. syori()
  665. {
  666.     int    i1 = 0,
  667.         tou = 0,
  668.         touhenka = 0,
  669.         nagasa = 0,
  670.         hiraki = 0,    /* 開き括弧数 */
  671.         toji = 0,    /* 閉じ括弧数 */
  672.         kakko_check = 0,
  673.         yomi_ken=0;
  674.  
  675.     uchar
  676.         shityou_henka = 0;
  677.  
  678.     /*
  679.         変数の初期化
  680.     */
  681.  
  682.     yomi_ken = get_ken_code( moto_str );    /* いま読んだ行の県コードを得る */
  683.  
  684.     /*
  685.         第7項 都道府県名の処理
  686.     */
  687.     get_koumoku( 7, work_todo );    /* 都道府県名を得る */
  688.     get_koumoku( 4, work_yomi );    /* その読みを得る */
  689.     if( str_ncmp( gen_todo, work_todo ) != 0 ) {    /* 新しい都道府県名である */
  690.         put_data( ' ', work_todo );    /* ファイルに書き出し */
  691.         put_data( '+', work_yomi );    /* 読みも */
  692.         strcpy( gen_todo, work_todo );    /* 都道府県名を更新 */
  693.         gen_shiku[0] = '\0';        /* 市区郡町村名の初期化 */
  694.         printf("\n\n%s\n",gen_todo);
  695.     }
  696.  
  697.     /*
  698.         第8項 市区郡町村名の処理
  699.     */
  700.     get_koumoku( 8, work_shiku );
  701.     get_koumoku( 5, work_yomi );
  702.  
  703.     old_kubun = shiku_kubun;
  704.     shiku_kubun = shiku_hantei( work_shiku, yomi_ken );    /* 市か区か郡か判定する */
  705.  
  706.     if( str_ncmp( gen_shiku, work_shiku ) != 0 ) {    /* 新しい市区郡町村名である */
  707.  
  708.         shityou_henka = 1;            /* 新しいのでフラグ立てる */
  709.         strcpy( gen_shiku, work_shiku );    /* 市区郡町村名を更新 */
  710.         del_last_char( work_shiku );        /* 末尾の全角1文字を削除 */
  711.  
  712.         switch( shiku_kubun ) {
  713.  
  714.         /* 市 */
  715.         case 1:
  716.             if( old_kubun == 2 || old_kubun == 3 ) {    /* 直前が区なら */
  717.                 printf("\n");    /* 改行する */
  718.             }
  719.             put_data( '!', work_shiku );    /* ファイル書き出し */
  720.             put_data( '+', work_yomi );
  721.             printf("%s市 ", work_shiku );
  722.             break;
  723.  
  724.         /* 政令指定都市内の区 */
  725.         case 2:
  726.             strcpy( old_kugun, gen_gun );    /* 直前の市名を退避 */
  727.             shiku_bunri( yomi_ken );
  728.             if( str_ncmp( work_shigun, old_kugun ) != 0 ) {    /* 市名が違うなら */
  729.                 if( old_kubun == 2 ) {    /* 直前が市内区なら */
  730.                     printf("\n");    /* 改行する */
  731.                 }
  732.                 strcpy( gen_gun, work_shigun );    /* 処理中の市名を更新 */
  733.                 put_data( '!', gen_gun );
  734.                 put_data( '+', gun_yomi );
  735.                 printf("%s市 : ", gen_gun );
  736.             }
  737.             put_data( '$', work_shiku );
  738.             put_data( '+', tyouson_yomi );
  739.             printf("%s区 ", work_shiku );
  740.             break;
  741.  
  742.         /* 特別区 */
  743.         case 3:
  744.             put_data( '\"', work_shiku );    /* ファイル書き出し */
  745.             put_data( '+', work_yomi );
  746.             printf("%s区 ", work_shiku );
  747.             break;
  748.  
  749.         /* 町 */
  750.         case 4:
  751.             if( old_kubun != 4 && old_kubun != 5 ) {
  752.                 gen_gun[0] = '\0';
  753.             }
  754.             strcpy( old_kugun, gen_gun );    /* 直前の郡名を退避 */
  755.             tou = gun_bunri( yomi_ken );
  756.             /* 郡名が違うなら(島しょを除く) */
  757. //            if( tou==0 && str_ncmp( work_shigun, old_kugun ) != 0 ) {
  758.             if( str_ncmp( work_shigun, old_kugun ) != 0 ) {
  759.                 strcpy( gen_gun, work_shigun );    /* 処理中郡名を更新 */
  760.                 put_data( '#', gen_gun );
  761.                 put_data( '+', gun_yomi );
  762.                 printf("\n%s郡 : ",gen_gun);
  763.             }
  764. //            if( touhenka == 0 && tou == 1 ) {    /* 島しょに入った */
  765. //                puts("");
  766. //                touhenka = 1;
  767. //            }
  768.             put_data( ':', work_shiku );    /* ファイル書き出し */
  769.             put_data( '+', tyouson_yomi );
  770.             printf("%s町 ", work_shiku );
  771.             break;
  772.  
  773.         /* 村 */
  774.         case 5:
  775.             if( old_kubun != 4 && old_kubun != 5 ) {
  776.                 gen_gun[0] = '\0';
  777.             }
  778.             strcpy( old_kugun, gen_gun );    /* 直前の郡名を退避 */
  779.             tou = gun_bunri( yomi_ken );
  780.             /* 郡名が違うなら(島しょを除く) */
  781. //            if( tou==0 && str_ncmp( work_shigun, old_kugun ) != 0 ) {
  782.             if( str_ncmp( work_shigun, old_kugun ) != 0 ) {
  783.                 strcpy( gen_gun, work_shigun );    /* 処理中郡名を更新 */
  784.                 put_data( '#', gen_gun );
  785.                 put_data( '+', gun_yomi );
  786.                 printf("\n%s郡 : ", gen_gun);
  787.             }
  788. //            if( touhenka == 0 && tou == 1 ) {    /* 島しょに入った */
  789. //                puts("");
  790. //                touhenka = 1;
  791. //            }
  792.             put_data( ';', work_shiku );    /* ファイル書き出し */
  793.             put_data( '+', tyouson_yomi );
  794.             printf("%s村 ", work_shiku );
  795.             break;
  796.  
  797.         }
  798.     }
  799.  
  800.     if( shityou_henka ) {    /* 変化したばかりである */
  801.  
  802.         get_koumoku( 9, work_azamei );    /* 字名を得る */
  803.  
  804.         if( strstr( work_azamei, "以下に掲載が" ) == NULL ) {
  805.             /* 頭の行なのに「以下に掲載がない場合」がない */
  806.             if( strstr( work_azamei, "一円" ) == NULL ) {    /* 一円でもない */
  807.                 /* 一円という地名もあるが、その時は shityou_henka は
  808.                   立っていないはずであるので */
  809.                 printf("おかしい。頭の行なのに「以下に掲載」がない|%s|%s|\n",
  810.                     work_shiku,work_azamei);
  811.             }
  812.         }
  813.  
  814.         num_put();    /* 番号を書く=該当なし時番号 */
  815.  
  816.         shityou_henka = 0;    /* フラグ寝せる */
  817.  
  818.     } else {
  819.  
  820.         /* 字名処理 */
  821.         get_koumoku( 9, work_azamei );
  822.         get_koumoku( 6, work_yomi );
  823.  
  824.         /* 括弧存在チェック */
  825.         if( strstr( work_azamei, "(" ) != NULL ) {    /* 括弧があれば */
  826.  
  827.             kakko_check = 0;
  828.             do {
  829.                 /* 括弧数を調べる 開き括弧=0x8169、閉じ括弧=0x816a */
  830.                 nagasa = strlen( work_azamei );
  831.                 hiraki = 0;
  832.                 toji = 0;
  833.                 for( i1=0; i1<=nagasa-2; i1++ ) {    /* 2文字おき */
  834.                     if( work_azamei[i1  ] == 0x81 &&
  835.                         work_azamei[i1+1] == 0x69 ) {    /* ( */
  836.                         hiraki++;
  837.                     } else
  838.                     if( work_azamei[i1  ] == 0x81 &&
  839.                         work_azamei[i1+1] == 0x6a ) {    /* ) */
  840.                         toji++;
  841.                     }
  842.                 }
  843.                 /* 均等が取れていない=次の行に続いている */
  844.                 if( hiraki - toji != 0 ) {
  845.  
  846.                     /* もう1行ゲットする=これは安全に取れるはず */
  847.                     fgets( moto_str, 256, ai );
  848.                     get_koumoku( 9, work_azamei2 );    /* 項目ゲット */
  849.                     if( strlen( work_azamei ) + 
  850.                         strlen(work_azamei2) >= 2048 ) {
  851.                         printf("文字列が長すぎる:|%s|%s|\n",
  852.                         work_azamei,work_azamei2);
  853.                     }
  854.                     /* コンカチ */
  855.                     strcat( work_azamei, work_azamei2 );
  856.                 } else {
  857.                     kakko_check = 1;
  858.                 }
  859.             } while( kakko_check == 0 );
  860.         }
  861.  
  862.         put_data( '%', work_azamei );
  863.         put_data( '+', work_yomi );
  864.  
  865.         num_put();
  866.     }
  867.  
  868.     return;
  869. }
  870.